ํ๋ก ํธ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ํต์ฌ: ESLint, Prettier, Babel ์ดํดํ๊ธฐ
ํ๋ก ํธ์๋ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๊ฐ์ฅ ๋จผ์ ๋ง์ฃผ์น๋ ๋๊ตฌ๋ค์ด ์์ต๋๋ค. ๋ฐ๋ก ESLint, Prettier, Babel์ ๋๋ค. ์ด ๋๊ตฌ๋ค์ด ๊ฐ๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋์ง ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
1. ESLint: "์ฝ๋์ ๋ ผ๋ฆฌ์ ํ์ง์ ๋ด๋น"
ESLint๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ๋ฌธ๋ฒ ์๋ฌ๋ฅผ ์ฐพ์๋ด๊ณ , ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฒฝ๊ณ ํด์ฃผ๋ **๋ฆฐํฐ(Linter)**์ ๋๋ค.
- ์ฃผ์ ์ญํ :
- ์ ์ธํ๊ณ ์ฌ์ฉํ์ง ์์ ๋ณ์ ์ฐพ๊ธฐ.
- ์ ์๋์ง ์์ ํจ์ ํธ์ถ ๋ฐฉ์ง.
- ํน์ ์ฝ๋ฉ ์คํ์ผ ๊ฐ์ (์:
var๋์let,const๊ถ์ฅ).
- ํต์ฌ ์ฒ ํ: "์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋๊ฐ?"์ ์ง์คํฉ๋๋ค.
2. Prettier: "์ฝ๋์ ๋ฏธ์ ์ผ๊ด์ฑ์ ๋ด๋น"
Prettier๋ ์ฝ๋๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ์ ๋ ฌํด์ฃผ๋ **ํฌ๋งทํฐ(Formatter)**์ ๋๋ค.
- ์ฃผ์ ์ญํ :
- ์ค ๋ฐ๊ฟ, ๋ค์ฌ์ฐ๊ธฐ(Tab vs Space) ์๋ ๊ต์ .
- ๋ฐ์ดํ ์คํ์ผ(
'vs") ํต์ผ. - ์ธ๋ฏธ์ฝ๋ก (
;) ๋๋ฝ ๋ณด์ .
- ํต์ฌ ์ฒ ํ: "์ฝ๋๊ฐ ์์๊ณ ์ผ๊ด๋๊ฒ ๋ณด์ด๋๊ฐ?"์ ์ง์คํฉ๋๋ค.
- ํ์ ์ ์ด์ : ๋๊ฐ ์์ฑํ๋ ์ฝ๋๊ฐ ๋์ผํ ํ์์ ์ ์งํ๋ฏ๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๊ฐ ์์ํด์ง๋๋ค.
3. Babel: "์ฝ๋์ ํธํ์ฑ์ ๋ด๋น"
Babel์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ(ES6+)์ ๊ตฌํ ๋ธ๋ผ์ฐ์ (IE ๋ฑ)์์๋ ๋์๊ฐ ์ ์๋ ์ฝ๋๋ก ๋ฐ๊ฟ์ฃผ๋ **ํธ๋์คํ์ผ๋ฌ(Transpiler)**์ ๋๋ค.
- ์ฃผ์ ์ญํ :
- ํ์ดํ ํจ์(
=>)๋ฅผ ์ผ๋ฐfunction์ผ๋ก ๋ณํ. class,import๋ฑ ์ต์ ๋ฌธ๋ฒ์ ํ์ ๋ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ฒ์ญ.- JSX(React) ๋ฌธ๋ฒ์ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํ.
- ํ์ดํ ํจ์(
- 2026๋ ํธ๋ ๋: ์ต๊ทผ์๋ ์๋๊ฐ ๋ ๋น ๋ฅธ SWC๋ esbuild๊ฐ Babel์ ์ญํ ์ ๋์ฒดํ๊ณ ์๋ ์ถ์ธ์ ๋๋ค.
4. ์ด ๋๊ตฌ๋ค์ ์ ํจ๊ป ์ฐ๋์? (ํ์ ์๋์ง)
| ๊ตฌ๋ถ | ESLint | Prettier | Babel |
|---|---|---|---|
| ๊ด์ฌ์ฌ | ์ฝ๋ ์๋ฌ ๋ฐ ํ์ง (Logic) | ์คํ์ผ๋ง ๋ฐ ํฌ๋งทํ (Style) | ๋ธ๋ผ์ฐ์ ํธํ์ฑ (Compatibility) |
| ์๋ ์์ | ๊ฐ๋ฐ ์ค (IDE) / ๋น๋ ์ | ์ฝ๋ ์ ์ฅ ์ (Save) | ๋น๋ ์ (Build) |
์ฃผ์: ESLint์ Prettier์ ์ถฉ๋ ๋ฐฉ์ง
๋ ๋๊ตฌ ๋ชจ๋ ์คํ์ผ ๊ด๋ จ ์ค์ ์ ๊ฐ์ง ์ ์์ด ์๋ก ๋ถ๋ชํ ๋๊ฐ ์์ต๋๋ค. (์: ESLint๋ ์์๋ฐ์ดํ๋ฅผ ์ํ๋๋ฐ, Prettier๋ ํฐ๋ฐ์ดํ๋ก ์๋ ์์ ํด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ)
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ณดํต eslint-config-prettier๋ฅผ ์ค์นํ์ฌ ์คํ์ผ ๊ต์ ๊ถํ์ Prettier์๊ฒ ์์ํ๋ ์ค์ ์ ์ถ๊ฐํฉ๋๋ค.
5. ์ค๋ฌด ๊ถ์ฅ ์ค์ ์์ (Standard Config)
ํ๋ก์ ํธ ๋ฃจํธ์ ์๋ ํ์ผ๋ค์ ์์ฑํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ํ์ค ์ค์ ์ ๋๋ค.
โ Prettier ์ค์ (.prettierrc)
{
"printWidth": 100, // ํ ์ค ์ต๋ ๊ธธ์ด
"tabWidth": 2, // ๋ค์ฌ์ฐ๊ธฐ ์นธ ์
"useTabs": false, // ํญ ๋์ ์คํ์ด์ค ์ฌ์ฉ
"semi": true, // ๋ฌธ์ฅ ๋ ์ธ๋ฏธ์ฝ๋ก ์ฌ์ฉ
"singleQuote": true, // ์์๋ฐ์ดํ ์ฌ์ฉ
"trailingComma": "all", // ์ฌ๋ฌ ์ค ์์์ ๋ง์ง๋ง ์ฝค๋ง ์ถ๊ฐ
"bracketSpacing": true, // ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ค๊ดํธ ์ฌ์ด ๊ณต๋ฐฑ
"arrowParens": "always" // ํ์ดํ ํจ์ ์ธ์ ๊ดํธ ํ์
}โก ESLint ์ค์ (eslint.config.js - v9+ Flat Config ๊ธฐ์ค)
์ต์ ESLint๋ eslint.config.js๋ผ๋ ์ด๋ฆ์ ํ๋ซ ์ค์ ์ ์ฌ์ฉํฉ๋๋ค.
import js from "@eslint/js";
import prettier from "eslint-config-prettier";
export default [
js.configs.recommended, // ๊ธฐ๋ณธ ์๋ฐ์คํฌ๋ฆฝํธ ์ถ์ฒ ๊ท์น
prettier, // Prettier์ ์ถฉ๋ํ๋ ๊ท์น ๋นํ์ฑํ
{
rules: {
"no-unused-vars": "warn", // ์ฌ์ฉํ์ง ์๋ ๋ณ์๋ ๊ฒฝ๊ณ ๋ง
"no-console": "off", // ์ฝ์ ๋ก๊ทธ ํ์ฉ
"eqeqeq": "error", // === ์ฌ์ฉ ๊ฐ์
"curly": "error" // ์ ์ด๋ฌธ ์ค๊ดํธ ํ์
}
}
];6. ์์ฝ
- ์๋ฌ๋ฅผ ์ก๊ณ ์ถ๋ค๋ฉด? -> ESLint
- ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ค ๋ง์ถ๊ณ ์ถ๋ค๋ฉด? -> Prettier
- ์ต์ ๋ฌธ๋ฒ์ ์ด๋์๋ ๋๋ฆฌ๊ณ ์ถ๋ค๋ฉด? -> Babel
์ด ์ธ ๊ฐ์ง ๋๊ตฌ๋ฅผ ์กฐํ๋กญ๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์์ฐ์ฑ ๋์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ฒซ๊ฑธ์์ ๋๋ค.